package com.edmond.controller;

import com.edmond.entity.Category;
import com.edmond.entity.Goods;
import com.edmond.service.ICategoryService;
import com.edmond.service.IGoodsService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.UUID;

@Controller
@RequestMapping("/admin/goods")
public class AdminGoodsController {
    @Resource
    private ICategoryService categoryService;   //  传递业务接口查询所有分类信息

    @Resource
    private IGoodsService goodsService;

    //  展示商品信息列表
    @RequestMapping("/list")
    public String list(Model model) {
        List<Goods> goodsList = goodsService.list();
        //  将 goodsList 的查询结果封装进model对象，并通过model对象返回前端
        model.addAttribute("goodsList", goodsList);
        return "/admin/goods_list";
    }

    //  显示添加商品详情页面
    @RequestMapping("/add_show")
    public String add_show(Model model) {
        //  查询所有类别信息，并封装进model对象返回前端页面
        List<Category> categoryList = categoryService.list();
        model.addAttribute("categoryList", categoryList);
        return "/admin/goods_add";
    }

    @RequestMapping("/add_submit")
    public String add_submit(Goods goods, MultipartFile file) {
        //  注意MultipartFile 类型参数 file 名称要与文本框 name属性名称一致
        String imgFile = null;
        //  判断客户端是否选择了图片
        if (file.isEmpty()) {
            //  用户没有 上传图片--使用默认图片
            imgFile = "/img/default.png";
        } else {
            //  用户上传了新的文件，生成新的文件名并 进行文件存储
            String newFile = UUID.randomUUID() + "-" + file.getOriginalFilename();  //  设置新的文件名
            //  使用新文件名构建文件对象（第一个参数是父级目录类路径，第二个参数是文件对象名）
            File f = new File("F:\\study_space\\springboot_mall\\project_img", newFile);
            //  若父级目录不存在，创建 父级目录
            if (!f.getParentFile().exists()) {
                f.mkdirs();
            }
            try {
                //  将参数中的文件对象保存到对应的位置
                file.transferTo(f);
                //  在数据库中存储 web访问路径 + 新的文件名
                imgFile = "/upfile/" + newFile;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        //  将文件的web访问路径设置到picture属性上
        goods.setPicture(imgFile);
        goodsService.insert(goods);
        //  跳转到商品查询页面
        return "redirect:/admin/goods/list";
    }

    //  显示商品修改的页面
    @RequestMapping("/update_show")
    public String update_show(Integer goodsId, Model model) {
        //  根据编号获取商品信息
        Goods goods = goodsService.find(goodsId);
        //  查询分类数据
        List<Category> categoryList = categoryService.list();
        model.addAttribute("goods", goods);
        model.addAttribute("categoryList", categoryList);
        return "/admin/goods_update";
    }

    //  修改商品信息controller
    @RequestMapping("/update_submit")
    public String update_submit(Goods goods, MultipartFile file) {
        //  修改：如果用户上传的图片不为空，则使用新的图片（进入保存图片流程）
        if (!file.isEmpty()) {
            //  用户上传了新的文件，生成新的文件名并 进行文件存储
            String newFile = UUID.randomUUID() + "-" + file.getOriginalFilename();  //  设置新的文件名
            //  使用新文件名构建文件对象（第一个参数是父级目录类路径，第二个参数是文件对象名）
            File f = new File("F:\\study_space\\springboot_mall\\project_img", newFile);
            //  若父级目录不存在，创建 父级目录
            if (!f.getParentFile().exists()) {
                f.mkdirs();
            }
            try {
                //  将参数中的文件对象保存到对应的位置
                file.transferTo(f);
                //  在数据库中存储 web访问路径 + 新的文件名
                goods.setPicture("/upfile/" + newFile);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        goodsService.update(goods);
        //  跳转到商品查询页面
        return "redirect:/admin/goods/list";
    }

    //  根据 id 删除商品
    @RequestMapping("/delete")
    public String delete(Integer goodsId) {
        //  调用业务接口删除商品信息，重定向到商品信息列表页面
        goodsService.delete(goodsId);
        return "redirect:/admin/goods/list";
    }
}
